﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HerGoS.DAO;
using HerGoS.Interfaces;
using HerGoS.Administration.Entities;
using System.Data;
using HerGoS.Administration.Engine;
using HerGoS.Administration.Exceptions;
using HerGoS.Administration.Exceptions.Parametrizacion;

namespace HerGoS.Administration.Engine
{
    public class GestorPersona
    {

        public static Persona Obtener(int OID)
        {
            try
            {
                IRepository repo = RepositoryFactory.Create(Config.RepositoryName);
                repo.Nombre = "PERSONAS_SP";
                repo.AddParameter("@ACCION", "BYID");
                repo.AddParameter("@ID", OID);
                DataTable dt = repo.ExecuteDataTable();
                Persona result = dt.ToGenericList<Persona>(PersonaConverter).FirstOrDefault();
                              

                return result;
            }
            catch (Exception ex)
            {
                throw new PersonaGetException(ex);
            }
        }


        #region Guardar

        public static void Guardar(Persona persona)
        {
           
            //ValidarPersonaDuplicada()
            
            try
            {
                IRepository repo = RepositoryFactory.CreateTransactional(Config.RepositoryName);
                repo.Nombre = "PERSONAS_PROC";
                repo.AddParameter("@ACCION ",persona.Persistencia);
                repo.AddParameter("@ID", persona.OID);
                repo.AddParameter("@APELLIDOS", persona.Apellidos);
                repo.AddParameter("@NOMBRES", persona.Nombres);
                repo.AddParameter("@CUIT", persona.Cuit);
                repo.AddParameter("@DNI", persona.DNI);
                repo.AddParameter("@IDCONDICIONAFIP",  persona.CondicionAfip == null ? (int?)null : persona.CondicionAfip.OID);
                repo.AddParameter("@SEXO ", persona.Sexo);
                repo.AddParameter("@FECHANACIMIENTO", persona.FechaNacimiento);
                repo.AddParameter("@IDESTADOCIVIL", persona.EstadoCivil.OID);
                repo.AddParameter("@IDNACIONALIDAD", persona.Nacionalidad.OID);
                repo.AddParameter("@OBSERVACIONES", persona.Observaciones);
                repo.AddParameter("@IDPUESTO", persona.perPUESTO == null ? (int?)null : persona.perPUESTO.OID);
                repo.AddParameter("@ENTIDAD", persona.Entidad == 0 ?  (int?) null : persona.Entidad);
                repo.AddParameter("@IDAREA", persona.Area == null ? (int?)null : persona.Area.OID);
                repo.AddParameter("@HORARIO", persona.Horario);
                repo.AddParameter("@FECHAINICIO", persona.FechaInicio);
                repo.AddParameter("@FECHAFIN", persona.FechaFin);
                repo.AddParameter("@IDUSUARIO", HGSContext.Usuario.OID);
                persona.OID = repo.ExecuteReturnValue().ToInteger();
                repo.Commit();

                GestorBitacora.Guardar(persona);

                GestorContacto.Guardar(persona);

                GestorDomicilio.Guardar(persona);

                GestorCuentaBancaria.Guardar(persona);

                GestorContrato.Guardar(persona);

               

            }
            catch (Exception ex)
            {
                throw new PersonaSaveException(ex);
            }
        }
        #endregion

        public static void Eliminar(Persona persona)
        {
            persona.Persistencia = EstadoPersistencia.DELETE;
            Guardar(persona);
            persona.Persistencia = EstadoPersistencia.UPDATE;
            persona.Activo = false;
        }
        public static void ReActivar(Persona persona)
        {
            persona.Persistencia = EstadoPersistencia.UNDELETE;
            Guardar(persona);
            persona.Persistencia = EstadoPersistencia.UPDATE;
            persona.Activo = true;
        }

        public static List<Persona> Consultar(ConsultaPersonaDTO persona)
        {
            try
            {
                IRepository repo = RepositoryFactory.Create(Config.RepositoryName);
                repo.Nombre = "PERSONAS_SP";
                repo.AddParameter("@ACCION", "CONSULTA");
                repo.AddParameter("@ID", null);
                repo.AddParameter("@CUIT", persona.Cuit);
                repo.AddParameter("@DNI", persona.DNI);
                repo.AddParameter("@APELLIDOS", persona.Apellidos);
                repo.AddParameter("@NOMBRES", persona.Nombres);
                if (persona.CondicionAfip != null)
                {
                    repo.AddParameter("@IDCONDICIONAFIP", persona.CondicionAfip.OID);
                }
                repo.AddParameter("@SEXO ", persona.Sexo);
                repo.AddParameter("@FECHANACIMIENTO", persona.FechaNacimiento);
                if (persona.EstadoCivil != null)
                {
                    repo.AddParameter("@IDESTADOCIVIL", persona.EstadoCivil.OID);
                }
                if (persona.Nacionalidad != null)
                {
                    repo.AddParameter("@IDNACIONALIDAD", persona.Nacionalidad.OID);
                }

                repo.AddParameter("@OBSERVACIONES", persona.Observaciones);
                if (persona.perPUESTO != null)
                    repo.AddParameter("@IDPUESTO", persona.perPUESTO.OID);

                repo.AddParameter("@HORARIO", persona.Horario);
                repo.AddParameter("@FECHAINICIO", persona.FechaInicio);
                repo.AddParameter("@FECHAFIN", persona.FechaFin);
                repo.AddParameter("@IDUSUARIO", HGSContext.Usuario.OID);
                repo.AddParameter("@ACTIVO", persona.Activo);
                DataTable dt = repo.ExecuteDataTable();
                List<Persona> result = dt.ToGenericList<Persona>(PersonaConverter);
                return result;
            }
            catch (Exception ex)
            {
                throw new PersonaGetException(ex);
            }
        }


        public static List<Persona> Consultar()
        {
            return Consultar(new ConsultaPersonaDTO { Activo = true });
        }

        public static List<Persona> Consultar(bool activo)
        {
            return Consultar(new ConsultaPersonaDTO { Activo = activo });
        }

        public static List<Persona> ObtenerPersonassinUsuario()
        {
            try
            {
                IRepository repo = RepositoryFactory.Create(Config.RepositoryName);
                repo.Nombre = "PERSONAS_SP";
                repo.AddParameter("@ACCION", "PERSONASINUSU");
                repo.AddParameter("@ID", null);
                DataTable dt = repo.ExecuteDataTable();
                List<Persona> result = dt.ToGenericList<Persona>(PersonaConverter);
                return result;
            }
            catch (Exception ex)
            {
                throw new PersonaGetException(ex);
            }
          
        }
        public static PersonaSolicitud ConsultaPersonasPorDNI(string dni)
        {
            try
            {
                IRepository repo = RepositoryFactory.Create(Config.RepositoryName);
                repo.Nombre = "PERSONAS_SP";
                repo.AddParameter("@ACCION", "PERSONASPORDNI");
                repo.AddParameter("@ID", null);
                repo.AddParameter("@DNI", dni);
                DataTable dt = repo.ExecuteDataTable();
                PersonaSolicitud result = dt.ToGenericList<PersonaSolicitud>(PersonaSolicitudConverter).FirstOrDefault();
                return result;

                //if (result.Contactos.Count > 0)
                //{
                //    var contacto = result.Contactos.Find(y => y.Email != string.Empty);

                //}

            }
            catch (Exception ex)
            {
                throw new PersonaGetException(ex);
            }

        }

        public static List<Persona> GetPersonasPorApellido(string apellidos)
        {
            List<Persona> listaPersonaSolicitud = new List<Persona>();
            try
            {
                IRepository repo = RepositoryFactory.Create(Config.RepositoryName);
                repo.Nombre = "PERSONAS_SP";
                repo.AddParameter("@ACCION", "PERSONASPORAPELLIDO");
                repo.AddParameter("@APELLIDOS", apellidos);
                DataTable dt = repo.ExecuteDataTable();
                listaPersonaSolicitud = dt.ToGenericList<Persona>(PersonaConverter);
                return listaPersonaSolicitud;

            }
            catch (Exception ex)
            {
                throw new PersonaGetException(ex);
            }
        }


        public static List<PersonaSolicitud> ListarPersonasPorApellido(string apellidos)
        {
            try
            {
                IRepository repo = RepositoryFactory.Create(Config.RepositoryName);
                repo.Nombre = "PERSONAS_SP";
                repo.AddParameter("@ACCION", "PERSONASPORAPELLIDO");
                repo.AddParameter("@APELLIDOS", apellidos);
                DataTable dt = repo.ExecuteDataTable();
                List<PersonaSolicitud> result = dt.ToGenericList<PersonaSolicitud>(PersonaSolicitudConverter);
                return result;

            }
            catch (Exception ex)
            {
                throw new PersonaGetException(ex);
            }
        }


        #region Converter
         public static PersonaSolicitud PersonaSolicitudConverter(DataRow row)
        {
            return new PersonaSolicitud
            {
                OID = row["perID"].ToInteger(),
                Persistencia = EstadoPersistencia.UPDATE,
                Apellidos = row["perAPELLIDOS"].ToString(),
                Nombres = row["perNOMBRES"].ToString(),
                FechaNacimiento = row["perFECHANACIMIENTO"].ToNullableDateTime(),  
                Cuit = row["perCuit"].ToString(),
                DNI = row["perDNI"].ToString(),
                Entidad = row["perEntidad"].ToInteger(),
                Area = GestorArea.Obtener(row["perAREA"].ToInteger()),
                
            };
         }

        public static Persona PersonaConverter(DataRow row)
        {
           
            Persona p =  new Persona
            {
                OID = row["perID"].ToInteger(),

                Persistencia = EstadoPersistencia.UPDATE,
                Apellidos = row["perAPELLIDOS"].ToString(),
                Nombres = row["perNOMBRES"].ToString(),
                Cuit = row["perCuit"].ToString(),
                DNI = row["perDNI"].ToString(),
                CondicionAfip = GestorCondicionAfip.Obtener(row["perIDCONDICIONAFIP"].ToInteger())?? null,
                Sexo = row["perSEXO"].ToBoolean() ,
                FechaNacimiento = row["PerFECHANACIMIENTO"].ToDateTime(),
                EstadoCivil = GestorEstadoCivil.Obtener(row["perIDESTADOCIVIL"].ToInteger())??null,
                Nacionalidad =  GestorPaises.Obtener(row["PerIDNACIONALIDAD"].ToInteger())??null,
                idPais = row["PerIDNACIONALIDAD"].ToInteger(),
                Observaciones = row["perOBSERVACIONES"].ToString(),
                Horario =  row["perHORARIO"].ToString(),
                perPUESTO= GestorPuesto.Obtener(row["perIDPUESTO"].ToInteger()),
                FechaInicio = row["perFECHAINICIO"].ToNullableDateTime(),
                FechaFin = row["perFECHAFIN"].ToNullableDateTime(),
                Entidad = row["perEntidad"].ToInteger(),
                Area = GestorArea.Obtener(row["perAREA"].ToInteger()),
                  
                Activo = row.IsNull("FECHA_BAJA") ? true : false

            };
            p.Contactos = GestorContacto.Consultar(p);
            p.Domicilios = GestorDomicilio.Consultar(p);
            p.CuentasBancarias = GestorCuentaBancaria.Consultar(p);
            p.Contratos = GestorContrato.Consultar(p);
            return p;

        }
        #endregion

       


    }
}
